﻿namespace MicroCloud.Utils
{
    /// <summary>
    /// 网络链接地址数据类型
    /// </summary>
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public class UrlAttribute : DataTypeAttribute
    {
        /// <summary>
        /// 网络链接地址正则表达式
        /// </summary>
        public const string UrlRegex = @"^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$";

        /// <summary>
        /// 初始化一个网络链接地址数据类型 <see cref="UrlAttribute"/> 的新实例
        /// </summary>
        public UrlAttribute()
            : base(DataType.Url)
        { }

        #region 方法 - Overrides of DataTypeAttribute
        /// <summary>
        /// 检查数据字段的值是否有效
        /// </summary>
        /// <param name="value">要验证的数据字段值</param>
        /// <returns>如果指定的值有效或 null，则为 true；否则，为 false</returns>
        public override bool IsValid(object value)
        {
            try
            {
                if (value.ToString().IsNullOrEmpty())
                {
                    return true;
                }
                var thisUrl = new Uri(value.ToString());
                return thisUrl != null;
            }
            catch
            {
                return false;
            }
        }
        
        /// <summary>
        /// 基于发生错误的数据字段对错误消息应用格式设置
        /// </summary>
        /// <param name="name">要包括在带有格式的消息中的名称</param>
        /// <returns>带有格式的错误消息的实例</returns>
        public override string FormatErrorMessage(string name)
        {
            return I18N.T("{0} 必须为有效的Url格式", name);
        }

        #endregion

    }
}
